/**
 * 详细测试脚本
 * 用于模拟获取当前用户信息的完整流程
 */

// 加载环境变量
require('dotenv').config();

const axios = require('axios');
const { register, login, authenticate } = require('../src/services/auth.service');
const { generateToken, verifyToken } = require('../src/utils/jwt');
const { logInfo, logError } = require('../src/logger');

// API基础URL
const BASE_URL = 'http://localhost:3000';

async function runDetailedTest() {
  try {
    logInfo('开始详细测试...');
    
    // 1. 注册新用户
    logInfo('步骤1: 注册新用户...');
    const timestamp = Date.now();
    const testUser = {
      username: `testuser_${timestamp}`,
      email: `test_${timestamp}@example.com`,
      password: 'TestPassword123!',
      phone: `138${Math.floor(10000000 + Math.random() * 90000000)}`,
      birthDate: '1990-01-01',
      birthTime: '08:30',
      gender: 'male',
      timezone: 'Asia/Shanghai'
    };
    
    const registerResult = await register(testUser);
    logInfo('用户注册成功', { userId: registerResult.user.id, token: registerResult.token });
    
    // 2. 验证令牌
    logInfo('步骤2: 验证令牌...');
    const decodedToken = verifyToken(registerResult.token);
    logInfo('令牌验证结果', { decodedToken });
    
    // 3. 使用认证服务验证令牌
    logInfo('步骤3: 使用认证服务验证令牌...');
    const authenticatedUser = await authenticate(registerResult.token);
    logInfo('认证服务验证结果', { authenticatedUser: authenticatedUser ? '成功' : '失败' });
    
    // 4. 直接调用API测试
    logInfo('步骤4: 直接调用API测试...');
    try {
      const apiResponse = await axios.get(`${BASE_URL}/api/users/me`, {
        headers: {
          'Authorization': `Bearer ${registerResult.token}`
        }
      });
      
      logInfo('API调用成功', { status: apiResponse.status, data: apiResponse.data });
    } catch (apiError) {
      logError('API调用失败', { 
        status: apiError.response ? apiError.response.status : 'N/A',
        message: apiError.message,
        data: apiError.response ? apiError.response.data : null
      });
    }
    
    logInfo('详细测试完成');
  } catch (error) {
    logError('详细测试出错', { error: error.message, stack: error.stack });
  }
}

// 如果直接运行此脚本，则执行测试
if (require.main === module) {
  runDetailedTest();
}

module.exports = {
  runDetailedTest
};